#include<iostream>
using namespace std;
#include<vector>
#include<unistd.h>
#include<sys/wait.h>
#include<sys/types.h>
#include<functional>
#include"task.h"
typedef function<void()> task;
void LoadTask(vector<task>& tasks)
{
    tasks.push_back(PrintLog);
    tasks.push_back(Download);
    tasks.push_back(backup);
}

int main()
{
    vector<task> tasks;
    LoadTask(tasks);
    pid_t id = fork();
    if(id == 0)
    {
        //子进程
        while(true)
        {
            printf("我是子进程，pid:%d\n",getpid());
            sleep(1);
        }
        exit(0);//子进程正常退出
    } 
    else
    {
         //父
         while(true)
         {
             pid_t rid = waitpid(id,0,WNOHANG); //非阻塞等待子进程
             if(rid > 0)
             {
                 printf("等待子进程成功,rid:%d\n",rid);
                 break;
             }
             else if(rid < 0)
             {
                 printf("等待子进程失败\n");
                 break;
             }
             else
             {
                 printf("子进程尚未退出\n");
                 //父进程做自己的事情...
                 for(auto& e : tasks)
                 {
                     e();
                 }
             }
             sleep(1);
         }
    }
    return 0;
}

////阻塞式等待子进程-----------------------------
//vector<int> data;
//int BeginSave()
//{
//    string name = to_string(time(nullptr));
//    name += ".backup";
//    FILE* fp = fopen(name.c_str(),"w");
//    if(fp == nullptr)
//    {
//        return 1;
//    }
//    string datastr;
//    for(auto& e : data)
//    {
//        datastr += to_string(e);
//        datastr += " ";
//    }
//    fputs(datastr.c_str(),fp);
//    fclose(fp);
//    return 0;
//}
//
//void Save()
//{
//    pid_t id = fork();
//    if(id == 0) //子进程
//    {
//        int code = BeginSave();//进行备份工作
//        exit(code);
//    }
//    int status = 0;
//    pid_t rid = waitpid(id,&status,0);//阻塞等待
//    if(rid > 0)
//    {
//        int code = WEXITSTATUS(status);
//        if(code == 0)
//            printf("备份成功，exit code:%d\n",code);
//        else
//            printf("备份失败\n");
//    }
//    else
//    {
//        perror("waitpid");   
//    }
//    
//}
//
//
//int main()
//{
//    int cnt = 0;
//    while(true)
//    {
//        data.push_back(cnt);
//        cnt++;
//        sleep(1);
//
//        if(cnt % 10 == 0)//10次备份一下
//        {
//            Save();
//        }
//    }
//    return 0;
//}
